+2007-04-30 Tor Lillqvist <tml@novell.com>
+
+ Add functionality to set overall opacity of a top-level
+ window. (#405316)
+
+ * gdk/gdk.symbols: Add gdk_window_set_opacity.
+
+ * gdk/x11/gdkwindow-x11.c
+ * gdk/win32/gdkwindow-win32.c: Implement
+ gdk_window_set_opacity(). On X11 use the _NET_WM_WINDOW_OPACITY
+ property. On Win32 use SetLayeredWindowAttributes(LWA_ALPHA).
+
+ * gdk/gdkwindow.h: Declare gdk_window_set_opacity().
+
+ * gdk/x11/gdkscreen-x11.c (gdk_screen_get_rgba_colormap): Document
+ that this is not implemented in the Windows backend. Add reference
+ to gdk_window_set_opacity().
+
2007-04-30 Matthias Clasen <mclasen@redhat.com>
* gtk/gtk.symbols:
gdk_window_set_icon
gdk_window_set_icon_name
gdk_window_beep
+gdk_window_set_opacity
gdk_window_iconify
gdk_window_deiconify
gdk_window_stick
gboolean setting);
void gdk_window_set_keep_below (GdkWindow *window,
gboolean setting);
-
+void gdk_window_set_opacity (GdkWindow *window,
+ gdouble opacity);
void gdk_window_register_dnd (GdkWindow *window);
void gdk_window_begin_resize_drag (GdkWindow *window,
{
gdk_display_beep (_gdk_display);
}
+
+void
+gdk_window_set_opacity (GdkWindow *window,
+ gdouble opacity)
+{
+ LONG exstyle;
+
+ g_return_if_fail (GDK_IS_WINDOW (window));
+ g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
+
+ if (opacity < 0)
+ opacity = 0;
+ else if (opacity > 1)
+ opacity = 1;
+
+ exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
+
+ if (!(exstyle & WS_EX_LAYERED))
+ API_CALL (SetWindowLong, (GDK_WINDOW_HWND (window),
+ GWL_EXSTYLE,
+ exstyle | WS_EX_LAYERED));
+
+ API_CALL (SetLayeredWindowAttributes, (GDK_WINDOW_HWND (window),
+ 0,
+ opacity * 0xff,
+ LWA_ALPHA));
+}
* when displaying the window on the screen: in particular, for
* X an appropriate windowing manager and compositing manager
* must be running to provide appropriate display.
- *
+ *
+ * This functionality is not implemented in the Windows backend.
+ *
+ * For setting an overall opacity for a top-level window, see
+ * gdk_window_set_opacity().
+
* Return value: a colormap to use for windows with an alpha channel
* or %NULL if the capability is not available.
*
gdk_display_beep (display);
}
+/**
+ * gdk_window_set_opacity:
+ * @window a top-level #GdkWindow
+ * @opacity: opacity
+ *
+ * Request the windowing system to make @window partially transparent,
+ * with opacity 0 being fully transparent and 1 fully opaque. (Values
+ * of the opacity parameter are clamped to the [0,1] range.) On X11
+ * this works only on X screens with a compositing manager running.
+ *
+ * For setting up per-pixel alpha, see gdk_screen_get_rgba_colormap().
+ *
+ * Since: 2.12
+ */
+void
+gdk_window_set_opacity (GdkWindow *window,
+ gdouble opacity)
+{
+ GdkDisplay *display;
+ guint32 cardinal;
+
+ g_return_if_fail (GDK_IS_WINDOW (window));
+ g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
+
+ display = gdk_drawable_get_display (window);
+
+ if (opacity < 0)
+ opacity = 0;
+ else if (opacity > 1)
+ opacity = 1;
+
+ cardinal = opacity * 0xffffffff;
+
+ if (cardinal == 0xffffffff)
+ XDeleteProperty (GDK_DISPLAY_XDISPLAY (display),
+ GDK_WINDOW_XID (window),
+ gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_OPACITY"));
+ else
+ XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
+ GDK_WINDOW_XID (window),
+ gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_OPACITY"),
+ XA_CARDINAL, 32,
+ PropModeReplace,
+ (guchar *) cardinal, 1);
+}
+
#define __GDK_WINDOW_X11_C__
#include "gdkaliasdef.c"